תוכנה 1 3 תרגול מס' מערכים ומבני בקרה
מערכים Array: A fixed-length data structure for storing multiple values of the same type Example: An array of odd numbers: Indices (start from 0) 0 1 2 3 4 5 6 7 odds: 1 3 5 7 9 11 13 15 The type of all elements is int odds.length == 8 The value of the element at index 4 is 9: odds[4] == 9 2
Array Declaration An array is denoted by the [] notation Examples: int[] odds; int odds[]; // legal but discouraged String[] names; int[][] matrix; // an array of arrays matrix: 3
Array Creation and Initialization What is the output of the following code: int[] odds = new int[8]; for (int i = 0; i < odds.length; i++) { System.out.print(odds[i] + " "); odds[i] = 2 * i + 1; System.out.print(odds[i] + " "); Output: Array creation: all elements get the default value for their type (0 for int) 0 1 0 3 0 5 0 7 0 9 0 11 0 13 0 15 4
Array Creation and Initialization Creating and initializing small arrays with a-priori known values: int[] odds = {1,3,5,7,9,11,13,15; String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "July", "Aug", "Sep", "Oct", "Nov", "Dec"; Jan months: 5
Loop through Arrays By promoting the array's index: for (int i = 0; i < months.length; i++) { System.out.println(months[i]); foreach (since Java 5.0): for (String month: months) { System.out.println(month); The variable month is assigned the next element in each iteration 6
Copying Arrays Assume: int[] array1 = {1,2,3; int[] array2 = {8,7,6,5; Naïve copy: array1 = array2; 8,7,6,5 array2 1,2,3 array1 How would we copy an array? 8
Copying Arrays Arrays.copyOf the original array the length of the copy int[] arr1 = {1, 2, 3; int[] arr2 = Arrays.copyOf(arr1, arr1.length); Arrays.copyOfRange the original array initial index of the range to be copied, inclusive final index of the range to be copied, exclusive See also: System.arraycopy 9
What is the output of the following code: int[] odds = {1, 3, 5, 7, 9, 11, 13, 15; int[] newodds = Arrays.copyOfRange(odds, 1, odds.length); for (int odd: newodds) { System.out.print(odd + " "); Output: 3 5 7 9 11 13 15 10
Other Manipulations on Arrays The java.util.arrays class has methods for sorting and searching, assigning arrays e.g. public static void sort(int[] a) public static int binarysearch(int[] a, int key) public static void fill(long[] a, long val) More details in JDK 6.0 documentation http://java.sun.com/javase/6/docs/api/java/util/arrays.html 11
2D Arrays There are no 2D arrays in Java but you can build array of arrays: char[][] board = new char[3][]; for (int i = 0; i < 3; i++) board[i] = new char[3]; Or equivalently: char[][] board = new char[3][3]; board 12
2D Arrays Building a multiplication table: int[][] table = new int[10][10]; for (int i = 0 ;i < 10 ;i++) { for (int j = 0 ;j < 10; j++) { table[i][j] = (i+1) * (j+1); 13
Fibonacci Fibonacci series: 1, 1, 2, 3, 5, 8, 13, 21, 34 Definition: fib(0) = 1 fib(1) = 1 fib(n) = fib(n-1) + fib(n-2) en.wikipedia.org/wiki/fibonacci_number
סלט פיבונאצ'י
If-Else Statement public class Fibonacci { /** Returns the n-th Fibonacci element */ public static int computeelement(int n) { if (n==0) return 1; else if (n==1) return 1; else return computeelement(n-1) + computeelement(n-2); Can be removed Assumption: n 0 16
Switch Statement public class Fibonacci { /** Returns the n-th Fibonacci element */ public static int computeelement(int n) { switch(n) { case 0: return 1; case 1: return 1; default: Assumption: n 0 can be placed outside the switch return computeelement(n-1) + computeelement(n-2); 17
Switch Statement public class Fibonacci { /** Returns the n-th Fibonacci element */ public static int computeelement(int n) { switch(n) { case 0: return 1; case 1: return 1; break; default: Compilation Error: Dead Code Assumption: n 0 return computeelement(n-1) + computeelement(n-2); 18
For Loop A loop instead of a recursion static int computeelement(int n) { if (n == 0 n == 1) return 1; int prev = 1; int prevprev = 1; int curr; Assumption: n 0 for (int i = 2 ; i < n ; i++) { curr = prev + prevprev; prevprev = prev; prev = curr; curr = prev + prevprev; return curr; 19
נתונים במקום חישוב בתרגום רקורסיה ללולאה אנו משתמשים במשתני עזר לשמירת המצב curr, prev ו- prevprev הלולאה "זוכרת" את הנקודה שבה אנו נמצאים בתהליך החישוב דיון: יעילות לעומת פשטות. עיקרון ה- KISS )keep it simple stupid( תרגיל: כתבו את השירות computeelement בעזרת prev ו- prevprev בלבד )ללא )curr 20
For Loop Printing the first n elements: public class Fibonacci { public static int computeelement(int n) { It is better to use args[0] public static void main(string[] args) { for(int i = 0 ; i < 10 ; i++) System.out.println(computeElement(i)); 21
מודולריות, שכפול קוד ויעילות יש כאן חוסר יעילות מסוים: לולאת ה- for חוזרת גם ב- main וגם ב-.computeElement לכאורה, במעבר אחד ניתן גם לחשב את האברים וגם להדפיס אותם כמו כן כדי לחשב איבר בסדרה איננו משתמשים בתוצאות שכבר חישבנו )של אברים קודמים( ומתחילים כל חישוב מתחילתו 22
מודולריות, שכפול קוד ויעילות צריכה לעשות דבר אחד בדיוק! והדפסה פוגע במודולריות )מדוע?( מתודה )פונקציה( ערוב של חישוב היזהרו משכפול קוד! קטע קוד דומה המופיע בשתי פונקציות שונות יגרום במוקדם או במאוחר לבאג בתוכנית )מדוע?( את בעיית היעילות )הוספת מנגנון )memoization אפשר לפתור בעזרת מערכים )תרגיל( 23
for vs. while The following two statements are almost equivalent: Variable i is not defined outside the for block for(int i = 0 ; i < n ; i++) System.out.println(computeElement(i)); int i=0; while (i < n) { System.out.println(computeElement(i)); i++; 24
while vs. do while The following two statements are equivalent if and only if n>0 : int i=0; while (i < n) { System.out.println(computeElement(i)); i++; works since n 1 int i=0; do { System.out.println(computeElement(i)); i++; while (i>n(; 25
שאלות? הסוף... 26